通常のAWS CDK App開発もprojen使ったら快適だった
「カジュアルにCDK使う時もprojenいいかも!」
簡単に作れて作り直しもしやすいため、検証用の使い捨ての環境をAWS CDK
で作ることがあります。
今まで私の中のprojenのイメージは、Construct Library
作る時に使うツールというの認識でした。(勉強不足でした)
通常のCDK App開発もprojen使ったら快適だったので共有します。
projenとは
projenは、プロジェクト構成ファイル(pacakge.json
ts-config.json
cdk.json
等)をコードで管理することができるツールです。
projen/projen: A new generation of project generators
projen synthesizes project configuration files such as package.json, tsconfig.json, .gitignore, GitHub Workflows, eslint, jest, etc from a well-typed definition written in JavaScript.
projenは、JavaScriptで記述された適切に型指定された定義から、package.json、tsconfig.json、.gitignore、GitHubワークフロー、eslint、jestなどのプロジェクト構成ファイルを合成します。
使用するメリット
- プロジェクト構成を1ファイルで管理できる
package.json
ts-config.json
cdk.json
.gitignore
GithubActionsワークフローファイル
等を管理できる
- CIやlintが設定済みの状態でプロジェクトが作成される
通常、パッケージ関連のファイルやCIの設定ファイルやなど個別に編集する必要がありますが、projenを使うことで.projenrc.js
を編集するだけで各ファイルを生成・管理できます。
ざっくりした流れは以下です。
- 公式のAPIリファレンスを見て
.projenrc.js
を編集 - projenコマンド実行(
npx projen
) - 各ファイルに変更が反映される
複数ファイルを編集しなくていいのが嬉しいですね。
また、CIやlintの設定がされた状態でプロジェクトが作成されます。
一時的な検証リソースをCDKで作った際に、「eslint設定した方が快適だな、でも長期間運用するわけでもないからコピペ面倒だな」と葛藤することがたまにありました。
(テンプレートリポジトリ作ればいいんですが、作ろうと思い何ヶ月か。。。)
projenを使えば、この辺も設定済みの状態でプロジェクト作ってくれるのでありがたいです。
やってみた
新規プロジェクトの作成
適当なディレクトリに移動して、プロジェクト作成のコマンドを実行します。
今回は、Construct Libraryではなく通常のCDKプロジェクトなのでawscdk-app-ts
を指定しました。
$ cd sample-projen $ npx projen new awscdk-app-ts
ディレクトリ構成
生成されるファイルを見てみます。
$ tree -a -I node_modules -I .git . ├── .eslintrc.json ├── .gitattributes ├── .github │ ├── pull_request_template.md │ └── workflows │ ├── build.yml │ ├── pull-request-lint.yml │ └── upgrade.yml ├── .gitignore ├── .mergify.yml ├── .npmignore ├── .projen │ ├── deps.json │ ├── files.json │ └── tasks.json ├── .projenrc.js ├── LICENSE ├── README.md ├── cdk.json ├── package.json ├── src │ └── main.ts ├── test │ └── main.test.ts ├── tsconfig.dev.json ├── tsconfig.json └── yarn.lock
.projenrc.js
このファイルを編集することで、各ファイルに情報を反映できます。
const { awscdk } = require('projen'); const project = new awscdk.AwsCdkTypeScriptApp({ cdkVersion: '2.1.0', defaultReleaseBranch: 'main', name: 'sample-projen', // deps: [], /* Runtime dependencies of this module. */ // description: undefined, /* The description is just a string that helps people understand the purpose of the package. */ // devDeps: [], /* Build dependencies for this module. */ // packageName: undefined, /* The "name" in package.json. */ }); project.synth();
例えば、以下のようにcdkVersion
を変更します。
+ cdkVersion: '2.31.0', - cdkVersion: '2.1.0',
その後、projenのコマンドを実行すると、pacakge.json
とyarn.lock
に変更が反映されます。
$ npx projen #変更の反映
"dependencies": { + "aws-cdk-lib": "^2.31.0", - "aws-cdk-lib": "^2.1.0", "constructs": "^10.0.5" },
+ aws-cdk-lib@^2.31.0: - aws-cdk-lib@^2.1.0:
使用できるオプションはAPIリファレンスで確認できます。
.projen/
projenによって生成されるファイルです。 手動で編集することはありません。
projenで管理しているファイル(files.json
)やタスク(tasks.json
)の一覧などを確認できます。
{ "files": [ ".eslintrc.json", ".gitattributes", ".github/pull_request_template.md", ".github/workflows/build.yml", ".github/workflows/pull-request-lint.yml", ".github/workflows/upgrade.yml", ".gitignore", ".mergify.yml", ".npmignore", ".projen/deps.json", ".projen/files.json", ".projen/tasks.json", "cdk.json", "LICENSE", "tsconfig.dev.json", "tsconfig.json" ], "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\"." }
.github/
デフォルトでは、パッケージ自動アップグレードやPRごとのビルドのワークフローが用意されます。
他のファイルと同様に.projenrc.js
を編集して無効化することもできます。
ワークフローを正常に動作させるためには、GithubでPAT(Personal Access Token)を作成してリポジトリシークレットに登録する必要があります。
- シークレット名:
PROJEN_GITHUB_TOKEN
- PAT権限:
repo
workflow
write:pacakges
admin:repo_hook
projen/docs/github.md · projen/projen
おわりに
何となくprojenはConstruct Library
作るようなCDK上級者向けのツールのイメージがありました。
プロジェクト構成をよしなに設定してくれるため、CDK触り始めた方やいい感じの設定されているCDKプロジェクトをサクッと作りたい方にもおすすめです。
lintやCIとか慣れていないと割と設定に時間かかると思いますが(コピペも面倒です)、projenを使うことでショートカットして快適な開発ができます。
以上、AWS事業本部の佐藤(@chari7311)でした。
参考
projen ではじめる快適 AWS CDK Construct Library 開発生活 - Qiita
【レポート+やってみた】projen – a CDK for software project configuration #CDK Day | DevelopersIO